package com.redepronik.negosys.utils;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Iva;
import com.redepronik.negosys.invfac.entity.Parametro;
import com.redepronik.negosys.invfac.service.IvaService;
import com.redepronik.negosys.invfac.service.ParametroService;

@Controller
public class Utils {

	public static void actualizarIva(Iva iva) {
		Utils.iva = iva;
	}

	public static int compareTo(BigDecimal valor, BigDecimal valor1) {
		return valor.compareTo(valor1);
	}

	@Autowired
	private ParametroService parametroService;
	@Autowired
	private IvaService ivaService;

	public static Parametro parametro;
	public static Iva iva;
	private static final SimpleDateFormat formatoFecha = new SimpleDateFormat(
			"dd/MM/yyyy");

	private static final long ms = 24 * 60 * 60 * 1000;

	private static final BigDecimal porcentaje = new BigDecimal("100");

	public static void actualizar(Parametro parametro) {
		Utils.parametro = parametro;
	}

	public static int compareTo(BigDecimal valor, Integer valor1) {
		return compareTo(valor, new BigDecimal(valor1));
	}

	public static int compareTo(BigDecimal valor, Long valor1) {
		return compareTo(valor, new BigDecimal(valor1));
	}

	public static int compareTo(BigDecimal valor, String valor1) {
		return compareTo(valor, new BigDecimal(valor1));
	}

	public static int compareTo(Date fecha, Date fecha1) {
		return fechaFormatoDate(fecha).compareTo(fechaFormatoDate(fecha1));
	}

	public static boolean comprobarCedula(String cedula) {
		if (cedula.compareTo("2222222222") == 0
				|| cedula.compareTo("9999999999") == 0
				|| cedula.compareTo("5555555555") == 0
				|| cedula.compareTo("4444444444") == 0
				|| cedula.compareTo("7777777777") == 0
				|| cedula.compareTo("0000000000") == 0)
			return false;

		if (cedula.length() == 10) {
			int s = 0;
			for (int i = 0; i < cedula.length(); i++) {
				int ced = Integer
						.parseInt(Character.toString(cedula.charAt(i)));
				if (i % 2 == 0) {
					String c1 = String.valueOf(ced * 2);
					if (c1.length() == 2)
						s += Integer.parseInt(Character.toString(c1.charAt(0)))
								+ Integer.parseInt(Character.toString(c1
										.charAt(1)));
					else
						s += Integer.parseInt(c1);
				} else
					s += ced;
			}
			if (s % 10 == 0)
				return true;
			else
				return false;
		} else if (cedula.length() == 13)
			return true;
		else
			return false;
	}

	public static Long diasMora(Date fecha, Date fechaMora) {
		return (fechaFormatoDate(fecha).getTime() - fechaFormatoDate(fechaMora)
				.getTime()) / ms;
	}

	public static BigDecimal divide(BigDecimal divisor, BigDecimal dividendo) {
		try {
			return divisor.divide(dividendo, parametro.getPrecisiondecimal(),
					parametro.getTiporedondeo());
		} catch (ArithmeticException e) {
			return newBigDecimal();
		}
	}

	public static BigDecimal divide(BigDecimal divisor, Integer dividendo) {
		return divide(divisor, new BigDecimal(dividendo));
	}

	public static BigDecimal divide(BigDecimal divisor, Long dividendo) {
		return divide(divisor, new BigDecimal(dividendo));
	}

	public static BigDecimal divide(BigDecimal divisor, String dividendo) {
		return divide(divisor, new BigDecimal(dividendo));
	}

	public static Date fechaFormatoDate(Date fecha) {
		return fechaFormatoDate(fechaFormatoString(fecha));
	}

	public static Date fechaFormatoDate(String fecha) {
		try {
			return formatoFecha.parse(fecha);
		} catch (ParseException e) {
			return new Date();
		}
	}

	public static String fechaFormatoString(Date fecha) {
		return formatoFecha.format(fecha);
	}

	public static String fechaFormatoString(Date fecha, String formato) {
		return new SimpleDateFormat(formato).format(fecha);
	}

	public static String fechaFormatoString(String fecha) {
		return fechaFormatoString(fechaFormatoDate(fecha));
	}

	// devuelve el iva de un valor
	public static BigDecimal iva(BigDecimal valor) {
		return multiplicarDivide(valor, iva.getPorcentaje());
	}

	public static BigDecimal moraTotal(Date fechaPago, Date fechaMora,
			BigDecimal porcentajeMora) {
		long diasMora = diasMora(fechaPago, fechaMora);
		BigDecimal moraDia = divide(porcentajeMora, "30");
		return multiplicar(moraDia, diasMora);
	}

	public static BigDecimal multiplicar(BigDecimal multiplicando,
			BigDecimal multiplicador) {
		return redondear(multiplicando.multiply(multiplicador));
	}

	public static BigDecimal multiplicar(BigDecimal multiplicando,
			Integer multiplicador) {
		return multiplicar(multiplicando, new BigDecimal(multiplicador));
	}

	public static BigDecimal multiplicar(BigDecimal multiplicando,
			Long multiplicador) {
		return multiplicar(multiplicando, new BigDecimal(multiplicador));
	}

	public static BigDecimal multiplicar(BigDecimal multiplicando,
			String multiplicador) {
		return multiplicar(multiplicando, new BigDecimal(multiplicador));
	}

	public static BigDecimal multiplicarDivide(BigDecimal multiplicando,
			BigDecimal multiplicador) {
		return divide(multiplicar(multiplicando, multiplicador), porcentaje);
	}

	public static BigDecimal multiplicarDivide(BigDecimal multiplicando,
			BigDecimal multiplicador, Integer divisor) {
		return divide(multiplicar(multiplicando, multiplicador), divisor);
	}

	public static BigDecimal multiplicarDivide(BigDecimal multiplicando,
			Integer multiplicador) {
		return multiplicarDivide(multiplicando, new BigDecimal(multiplicador));
	}

	public static BigDecimal multiplicarDivide(BigDecimal multiplicando,
			Integer multiplicador, BigDecimal divisor) {
		return divide(multiplicar(multiplicando, multiplicador), divisor);
	}

	public static BigDecimal multiplicarDivide(BigDecimal multiplicando,
			Long multiplicador) {
		return multiplicarDivide(multiplicando, new BigDecimal(multiplicador));
	}

	public static BigDecimal multiplicarDivide(BigDecimal multiplicando,
			String multiplicador) {
		return multiplicarDivide(multiplicando, new BigDecimal(multiplicador));
	}

	public static BigDecimal newBigDecimal() {
		return redondear("0.00");
	}

	public static BigDecimal parse(Object object) {
		return redondear(String.valueOf(object));
	}

	public static void presentaMensaje(Severity severity, String mensaje) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severity, "MENSAJE DEL SISTEMA", mensaje));
	}

	public static void presentaMensaje(Severity severity, String mensaje,
			String variable, boolean valorVariable) {
		presentaMensaje(severity, mensaje);
		RequestContext.getCurrentInstance().addCallbackParam(variable,
				valorVariable);
	}

	public static BigDecimal redondear(BigDecimal numero) {
		return numero.setScale(parametro.getPrecisiondecimal(),
				parametro.getTiporedondeo());
	}

	public static BigDecimal redondear(Integer numero) {
		return redondear(new BigDecimal(numero));
	}

	public static BigDecimal redondear(Long numero) {
		return redondear(new BigDecimal(numero));
	}

	public static BigDecimal redondear(String numero) {
		return redondear(new BigDecimal(numero));
	}

	public static BigDecimal redondearTotales(BigDecimal numero) {
		return numero.setScale(2, parametro.getTiporedondeo());
	}

	public static Timestamp timestamp() {
		return new Timestamp(new Date().getTime());
	}

	public static Timestamp timestamp(Date fecha) {
		return new Timestamp(fecha.getTime());
	}

	public static Timestamp timestamp(String fecha) {
		return new Timestamp(fechaFormatoDate(fecha).getTime());
	}

	// devuelve el valor sumandole el iva
	public static BigDecimal valorConIva(BigDecimal valor) {
		return multiplicar(valor, "1.12");
	}

	// devuelve la suma del valor mas su porcentaje
	public static BigDecimal valorConPorcentaje(BigDecimal valor,
			BigDecimal porcentaje) {
		return valor.add(multiplicarDivide(valor, porcentaje));
	}

	// devuelve el valor quitandole el iva
	public static BigDecimal valorSinIva(BigDecimal valor) {
		return divide(valor, "1.12");
	}

	// public void init() {
	// parametro = parametroService.obtener();
	// iva = ivaService.obtenerPorFecha(new Date());
	// }

}
